package com.honry.identityaccess.application;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;

import com.honry.common.domain.model.DomainEvent;
import com.honry.common.domain.model.DomainEventPublisher;
import com.honry.common.domain.model.DomainEventSubscriber;
import com.honry.common.event.EventStore;

@Aspect
public class IdentityAccessEventProcessor {
	@Autowired
	private EventStore eventStore;
	public IdentityAccessEventProcessor() {
		
	}
	/**
     * 注册一个IdentityAccessEventProcessor监听
     * 并转发所有领域事件给外部用户.
     * 使用此工厂方法的情况下提供Spring AOP装配并不理想。
     * This factory method is provided in the case where
     * Spring AOP wiring is not desired.
     */
	public void register(){
		(new IdentityAccessEventProcessor()).listen();
	}
	/**
     * 监听所有域事件并将它们存储。
     */
    @Before("execution(* com.honry.identityaccess.application.*.*(..))")
	public void listen(){
    	DomainEventPublisher
        .instance()
        .subscribe(new DomainEventSubscriber<DomainEvent>() {

            public void handleEvent(DomainEvent aDomainEvent) {
                store(aDomainEvent);
            }

            public Class<DomainEvent> subscribedToEventType() {
                return DomainEvent.class; // 所有的领域事件
            }
        });
	}
	/**
     * 存储domainEvent到事件存储.
     * @param domainEvent 要存储的 DomainEvent
     */
	private void store(DomainEvent domainEvent){
		this.eventStore().append(domainEvent);
	}
	/**
     * Answers my EventStore.
     * @return EventStore
     */
	private EventStore eventStore(){
		return this.eventStore;
	}
}
